Uurige, kuidas rakendada Fetch API-ga tüübikindlust TypeScriptis, et luua vastupidavamaid ja hooldatavamaid veebirakendusi. Õppige parimaid tavasid ja praktilisi näiteid.
TypeScripti veebi-API: Päringute tüübikindluse saavutamine vastupidavates rakendustes
Kaasaegses veebiarenduses on andmete toomine API-dest põhiülesanne. Kuigi JavaScripti natiivne Fetch API pakub mugavat viisi võrgupäringute tegemiseks, puudub sellel omane tüübikindlus. See võib viia käitusaja vigadeni ja muuta keerukate rakenduste hooldamise keeruliseks. TypeScript oma staatilise tüüpimise võimalustega pakub võimsat lahendust selle probleemi lahendamiseks. See põhjalik juhend uurib, kuidas rakendada Fetch API-ga tüübikindlust TypeScriptis, luues vastupidavamaid ja hooldatavamaid veebirakendusi.
Miks on tüübikindlus Fetch API puhul oluline
Enne rakendusdetailidesse süvenemist mõistame, miks on tüübikindlus Fetch API-ga töötamisel kriitilise tähtsusega:
- Vähendatud käitusaja vead: TypeScripti staatiline tüüpimine aitab vigu arenduse ajal tabada, vältides ootamatuid käitusaja probleeme, mis on põhjustatud valedest andmetüüpidest.
- Parem koodi hooldatavus: Tüübi annotatsioonid muudavad koodi lihtsamini mõistetavaks ja hooldatavaks, eriti suurtes projektides, kus on mitu arendajat.
- Parem arendajakogemus: IDE-d pakuvad paremat automaatset täitmist, vigade esiletõstmist ja refaktoriseerimisvõimalusi, kui tüübiteave on saadaval.
- Andmete valideerimine: Tüübikindlus võimaldab valideerida API-dest saadud andmete struktuuri ja tüüpe, tagades andmete terviklikkuse.
Fetch API põhikäitlus TypeScriptiga
Alustame lihtsa näitega Fetch API kasutamisest TypeScriptis ilma tüübikindluseta:
async function fetchData(url: string) {
const response = await fetch(url);
const data = await response.json();
return data;
}
fetchData('https://api.example.com/users')
.then(data => {
console.log(data.name); // Võimalik käitusaja viga, kui 'name' puudub
});
Selles näites toob funktsioon `fetchData` andmeid antud URL-ilt ja parandab vastuse JSON-ina. Kuid muutuja `data` tüüp on implitsiitselt `any`, mis tähendab, et TypeScript ei paku mingit tüübikontrolli. Kui API vastus ei sisalda omadust `name`, viskab kood käitusaja vea.
Tüübi ohutuse rakendamine liidestega
Kõige levinum viis Fetch API päringutele tüübikindluse lisamiseks TypeScriptis on liideste defineerimine, mis esindavad oodatavate andmete struktuuri.
Liideste defineerimine
Oletame, et me toome kasutajate loendi API-st, mis tagastab andmed järgmises vormingus:
[
{
"id": 1,
"name": "John Doe",
"email": "john.doe@example.com"
},
{
"id": 2,
"name": "Jane Smith",
"email": "jane.smith@example.com"
}
]
Saame defineerida liidese, et esindada seda andmestruktuuri:
interface User {
id: number;
name: string;
email: string;
}
Liideste kasutamine Fetch API-ga
async function fetchData(url: string): Promise {
const response = await fetch(url);
const data = await response.json();
return data as User[];
}
fetchData('https://api.example.com/users')
.then(users => {
users.forEach(user => {
console.log(user.name); // Tüübikindel juurdepääs omadusele 'name'
});
});
Selles uuendatud näites oleme lisanud funktsioonile `fetchData` tüübi annotatsiooni, täpsustades, et see tagastab `Promise`'i, mis lahendub `User` objektide massiiviks (`Promise Oluline märkus: Kuigi märksõna `as` teeb tüübikinnituse, ei tee see käitusaja valideerimist. See ütleb kompilaatorile, mida oodata, kuid see ei taga, et andmed tegelikult vastavad kinnitatud tüübile. Siin tulevad appi teegid nagu `io-ts` või `zod` käitusaja valideerimiseks, nagu me hiljem arutame. Korduvkasutatavamate päringufunktsioonide loomiseks saame kasutada genericit. Generics võimaldavad meil defineerida funktsiooni, mis saab töötada erinevate andmetüüpidega, ilma et peaks iga tüübi jaoks eraldi funktsioone kirjutama. Selles näites oleme defineerinud üldise `fetchData` funktsiooni, mis võtab tüüpparameetri `T`. Funktsioon tagastab `Promise`'i, mis lahendub tüübi `T` väärtuseks. Lisasime ka veakäsitluse, et kontrollida, kas vastus oli edukas. Selles näites kasutame üldist `fetchData` funktsiooni nii ühe `Post` kui ka `User` objektide massiivi toomiseks. TypeScript tuletab automaatselt õige tüübi vastavalt meie antud tüüpparameetrile. Fetch API-ga töötades on vigade ja olekukoodide käsitlemine ülioluline. Saame lisada oma `fetchData` funktsioonile veakäsitluse, et kontrollida HTTP-vigu ja vajadusel viga visata. Selles uuendatud näites kontrollime `response.ok` omadust, mis näitab, kas vastuse olekukood on vahemikus 200-299. Kui vastus ei ole OK, viskame vea koos olekukoodiga. Nagu varem mainitud, ei tee TypeScripti tüübikinnitused (`as`) käitusaja valideerimist. Et tagada, et API-st saadud andmed vastavad tegelikult oodatud tüübile, saame kasutada teeke nagu `io-ts` või `zod`. `io-ts` on teek käitusaja tüüpide defineerimiseks ja andmete valideerimiseks nende tüüpide vastu. Selles näites defineerime `UserType`'i kasutades `io-ts`'i, mis vastab meie `User` liidesele. Seejärel kasutame `decode` meetodit API-st saadud andmete valideerimiseks. Kui valideerimine ebaõnnestub, viskame vea koos valideerimisvigadega. `zod` on teine populaarne teek skeemide deklareerimiseks ja valideerimiseks. Selles näites defineerime `UserSchema` kasutades `zod`'i, mis vastab meie `User` liidesele. Seejärel kasutame `safeParse` meetodit API-st saadud andmete valideerimiseks. Kui valideerimine ebaõnnestub, viskame vea koos valideerimisvigadega. Nii `io-ts` kui ka `zod` pakuvad võimsat viisi tagamaks, et API-dest saadud andmed vastavad käitusajal oodatud tüübile. Tüübiturvalisi Fetch API päringuid saab hõlpsasti integreerida populaarsete JavaScripti raamistutega nagu React, Angular ja Vue.js. Laadimine... Viga: {error} Selles Reacti näites kasutame `useState` hook'i `users` massiivi oleku haldamiseks. Kasutame ka `useEffect` hook'i kasutajate toomiseks API-st, kui komponent paigaldatakse. Oleme lisanud tüübi annotatsioonid `users` olekule ja `data` muutujale, et tagada tüübikindlus. Selles Angulari näites kasutame API-kõne tegemiseks `HttpClient` teenust. Määrame vastuse tüübi `User[]`-na, kasutades genericit, mis tagab tüübikindluse. Selles Vue.js näites kasutame `ref` funktsiooni reaktiivse `users` massiivi loomiseks. Kasutame `onMounted` elutsükli hook'i, et tuua API-st kasutajad, kui komponent paigaldatakse. Oleme lisanud tüübi annotatsioonid `users` ref'ile ja `data` muutujale, et tagada tüübikindlus. Siin on mõned parimad tavad, mida järgida tüübikindlate Fetch API päringute rakendamisel TypeScriptis: Tüübikindluse rakendamine Fetch API-ga TypeScriptis on vastupidavate ja hooldatavate veebirakenduste loomisel hädavajalik. Liideste defineerimise, genericit kasutades, vigu käsitledes ja andmeid käitusajal valideerides saate oluliselt vähendada käitusaja vigu ja parandada üldist arendajakogemust. See juhend annab põhjaliku ülevaate sellest, kuidas saavutada tüübikindlus Fetch API-ga, koos praktiliste näidete ja parimate tavadega. Nende juhiste järgimisega saate luua usaldusväärsemaid ja skaleeritavamaid veebirakendusi, mida on lihtsam mõista ja hooldada.Genericsi kasutamine korduvkasutatavate päringufunktsioonide jaoks
Üldise päringufunktsiooni defineerimine
async function fetchData
Üldise päringufunktsiooni kasutamine
interface Post {
id: number;
title: string;
body: string;
userId: number;
}
fetchData
Vigade ja olekukoodide käsitlemine
async function fetchData
Käitusaja andmete valideerimine `io-ts` või `zod` abil
`io-ts` kasutamine
import * as t from 'io-ts'
import { PathReporter } from 'io-ts/PathReporter'
const UserType = t.type({
id: t.number,
name: t.string,
email: t.string
})
type User = t.TypeOf
`zod` kasutamine
import { z } from 'zod';
const UserSchema = z.object({
id: z.number(),
name: z.string(),
email: z.string().email(),
});
type User = z.infer
Integreerimine populaarsete raamistutega (React, Angular, Vue.js)
Reacti näide
import React, { useState, useEffect } from 'react';
interface User {
id: number;
name: string;
email: string;
}
function UserList() {
const [users, setUsers] = useState
{users.map(user => (
);
}
export default UserList;
Angulari näide
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
interface User {
id: number;
name: string;
email: string;
}
@Component({
selector: 'app-user-list',
template: `
`,
styleUrls: []
})
export class UserListComponent implements OnInit {
users: User[] = [];
constructor(private http: HttpClient) { }
ngOnInit() {
this.http.getVue.js näide
Parimad tavad tüübikindlate Fetch API päringute jaoks
Järeldus
Edasine uurimine